#ifndef ARCO_H
#define ARCO_H

#include<vector>
#include <sstream>

using std :: vector;

//Se instancia a Nodo para evitar la referencia cruzada.
template<class T>
class Nodo;

#include "Nodo.h"
                 
template<class T>
class Arco{
    
    private:
        int longitud;
        Nodo<T> * pNodo;
    
    public:
        Arco( Nodo<T>& , int );
        ~Arco();
        
        Nodo<T>& getNodo();
        int getLongitud();

        string toString();
        static bool test();

};

template<class T>
Arco<T> :: Arco( Nodo<T>& n , int longitud ){
    pNodo = &n;
    this->longitud = longitud;
}

template<class T>
Arco<T> :: ~Arco(){
}

template<class T>
Nodo<T>& Arco<T> :: getNodo(){
    return *pNodo;
}

template<class T>
int Arco<T> :: getLongitud(){
    return longitud;
}

//toString
template<class T>
string Arco<T> :: toString(){
    string arcoToString;
    
    ostringstream stream;

    stream << longitud;
    stream << pNodo.toString();
    
    arcoToString = stream.str();

    return arcoToString;
}

//test
template<class T>
bool Arco<T> :: test(){
     Nodo<char> nodo(5);
     
     Arco<char> arc(nodo, 3);
     
     cout << arc.getNodo().getNum() << endl;
     
     cout << arc.getLongitud() << endl;
     
     return true;
}

#endif
